package cxydmmszl.chapter08.t124;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;

/**
 * <li style="color: red;">Prob</li>
 * 未排序正数数组中累加和为给定值的最长子数组长度
 * <li style="color: green;">Desc</li>
 * 给定一个数组 arr，该数组无序，但每个值均为正数，再给定一个正数 k。
 * 求 arr 的所有子数组中所有元素相加和为 k 的最长子数组的长度。<br/>
 * 例如，arr = [1, 2, 1, 1, 1], k = 3<br/>
 * 累加和为 3 的最长子数组为[1, 1, 1]，所以结果返回 3
 * <br/><br/>[要求]<br/>时间复杂度为 O(n)，空间复杂度为 O(1)
 * <br/><br/>备注：<br/>
 * &emsp;1⩽N⩽10^5<br/>
 * &emsp;1⩽k⩽10^9<br/>
 * &emsp;1⩽arr[i]⩽100<br/>
 * <li style="color: green;">Input</li>
 * 第一行两个整数N, k。N 表示数组长度，k 的定义已在题目描述中给出；
 * 第二行N个整数表示数组内的数
 * <li style="color: green;">Output</li>
 * 输出一个整数表示答案
 * <li style="color: blue;">Link</li> CD8
 *
 * @author habitplus
 * @since 2021-10-08 09:29
 */
public class Main {
    static StreamTokenizer st =
            new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));

    static int nextInt() {
        try {
            st.nextToken();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return (int) st.nval;
    }

    public static void main(String[] args) {
        int n = nextInt();
        int k = nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = nextInt();
        }

        int ans = maxLen(arr, k);
        System.out.println(ans);
    }

    private static int maxLen(int[] arr, int k) {
        if (arr == null || arr.length == 0 || k <= 0) {
            return 0;
        }

        int n = arr.length;
        // 代表子数组 arr[left,right]
        int left = 0;
        int right = 0;
        // 代表 arr[left,right] 的子数组和
        int sum = arr[0];
        // 代表子数组的和为 k 的最大长度
        int res = 0;

        while (right < n) {
            if (sum < k) {
                right++;
                if (right == n) break;
                sum += arr[right];
            } else if (sum > k){
                sum -= arr[left++];
            } else {
                res = Math.max(res, right - left + 1);
                sum -= arr[left++];
            }
        }
        return res;
    }
}
